Package de.yaams.extensions.basemap.tiled.mapeditor.widget

Source Code of de.yaams.extensions.basemap.tiled.mapeditor.widget.TabbedTilesetsPane$MyChangeListener

/*
* Tiled Map Editor, (c) 2004-2008
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Adam Turk <aturk@biggeruniverse.com> Bjorn Lindeijer <bjorn@lindeijer.nl>
*
* This class is based on TilesetChooserTabbedPane from Stendhal Map Editor by
* Matthias Totz <mtotz@users.sourceforge.net>
*/

package de.yaams.extensions.basemap.tiled.mapeditor.widget;

import java.awt.Component;
import java.util.HashMap;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import com.jidesoft.swing.JideTabbedPane;

import de.yaams.extensions.basemap.tiled.core.Map;
import de.yaams.extensions.basemap.tiled.core.MapChangeListener;
import de.yaams.extensions.basemap.tiled.core.MapChangedEvent;
import de.yaams.extensions.basemap.tiled.core.TileSet;
import de.yaams.extensions.basemap.tiled.core.TilesetChangeListener;
import de.yaams.extensions.basemap.tiled.core.TilesetChangedEvent;
import de.yaams.extensions.basemap.tiled.mapeditor.MapEditor;
import de.yaams.extensions.basemap.tiled.mapeditor.brush.CustomBrush;
import de.yaams.extensions.basemap.tiled.mapeditor.util.TileRegionSelectionEvent;
import de.yaams.extensions.basemap.tiled.mapeditor.util.TileSelectionEvent;
import de.yaams.extensions.basemap.tiled.mapeditor.util.TileSelectionListener;

/**
* Shows one tab for each Tileset.
*
* @version $Id$
*/
public class TabbedTilesetsPane extends JideTabbedPane implements TileSelectionListener {

  private static final long serialVersionUID = -1190594964935357694L;
  /**
   * Map of tile sets to tile palette panels
   */
  private final HashMap<TileSet, TilePalettePanel> tilePanels = new HashMap<TileSet, TilePalettePanel>();
  private final MyChangeListener listener = new MyChangeListener();
  private final MapEditor mapEditor;
  private Map map;

  /**
   * Constructor.
   *
   * @param mapEditor
   *            reference to the MapEditor instance, used to change the
   *            current tile and brush
   */
  public TabbedTilesetsPane(MapEditor mapEditor) {
    this.mapEditor = mapEditor;
    setHideOneTab(true);
    setBorder(BorderFactory.createEmptyBorder());
  }

  /**
   * Sets the tiles panes to the the ones from this map.
   *
   * @param map
   *            the map of which to display the tilesets
   */
  public void setMap(Map map) {
    if (this.map != null) {
      this.map.removeMapChangeListener(listener);
    }

    if (map == null) {
      removeAll();
    } else {
      recreateTabs(map.getTilesets());
      map.addMapChangeListener(listener);
    }

    this.map = map;
  }

  /**
   * Creates the panels for the tilesets.
   *
   * @param tilesets
   *            the list of tilesets to create panels for
   */
  private void recreateTabs(List<TileSet> tilesets) {
    // Stop listening to the tile palette panels and their tilesets
    for (TilePalettePanel panel : tilePanels.values()) {
      panel.removeTileSelectionListener(this);
      panel.getTileset().removeTilesetChangeListener(listener);
    }
    tilePanels.clear();

    // Remove all tabs
    removeAll();

    if (tilesets != null) {
      // Add a new tab for each tileset of the map
      for (TileSet tileset : tilesets) {
        if (tileset != null) {
          addTabForTileset(tileset);
        }
      }
    }
  }

  /**
   * Adds a tab with a {@link TilePalettePanel} for the given tileset.
   *
   * @param tileset
   *            the given tileset
   */
  private void addTabForTileset(TileSet tileset) {
    tileset.addTilesetChangeListener(listener);
    TilePalettePanel tilePanel = new TilePalettePanel();
    tilePanel.setTileset(tileset);
    tilePanel.addTileSelectionListener(this);
    JScrollPane paletteScrollPane = new JScrollPane(tilePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    addTab(tileset.getName(), paletteScrollPane);
    tilePanels.put(tileset, tilePanel);
  }

  /**
   * Informs the editor of the new tile.
   */
  @Override
  public void tileSelected(TileSelectionEvent e) {
    mapEditor.setCurrentTile(e.getTile());
  }

  /**
   * Creates a stamp brush from the region contents and sets this as the
   * current brush.
   */
  @Override
  public void tileRegionSelected(TileRegionSelectionEvent e) {
    mapEditor.setBrush(new CustomBrush(e.getTileRegion()));
  }

  private class MyChangeListener implements MapChangeListener, TilesetChangeListener {
    @Override
    public void mapChanged(MapChangedEvent e) {}

    @Override
    public void tilesetAdded(MapChangedEvent e, TileSet tileset) {
      addTabForTileset(tileset);
    }

    @Override
    public void tilesetRemoved(MapChangedEvent e, int index) {
      JScrollPane scroll = (JScrollPane) getComponentAt(index);
      TilePalettePanel panel = (TilePalettePanel) scroll.getViewport().getView();
      TileSet set = panel.getTileset();
      panel.removeTileSelectionListener(TabbedTilesetsPane.this);
      set.removeTilesetChangeListener(listener);
      tilePanels.remove(set);
      removeTabAt(index);
    }

    @Override
    public void tilesetsSwapped(MapChangedEvent e, int index0, int index1) {
      int sIndex = getSelectedIndex();

      String title0 = getTitleAt(index0);
      String title1 = getTitleAt(index1);

      Component comp0 = getComponentAt(index0);
      Component comp1 = getComponentAt(index1);

      removeTabAt(index1);
      removeTabAt(index0);

      insertTab(title1, null, comp1, null, index0);
      insertTab(title0, null, comp0, null, index1);

      if (sIndex == index0) {
        sIndex = index1;
      } else if (sIndex == index1) {
        sIndex = index0;
      }

      setSelectedIndex(sIndex);
    }

    @Override
    public void tilesetChanged(TilesetChangedEvent event) {}

    @Override
    public void nameChanged(TilesetChangedEvent event, String oldName, String newName) {
      TileSet set = event.getTileset();
      int index = map.getTilesets().indexOf(set);

      setTitleAt(index, newName);
    }

    @Override
    public void sourceChanged(TilesetChangedEvent event, String oldSource, String newSource) {}
  }
}
TOP

Related Classes of de.yaams.extensions.basemap.tiled.mapeditor.widget.TabbedTilesetsPane$MyChangeListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.